//
//  Optional+Extensions.swift
//  SwiftUIFly
//
//  Created by shen on 2023/10/18.
//

import Foundation

// MARK: - Optional

public extension Optional {
    /// 判断是否为空
    var isNil: Bool {
        switch self {
        case .none:
            return true
        case .some:
            return false
        }
    }

    /// 判断是否有值
    var isNotNil: Bool {
        return !isNil
    }

    var isNull: Bool {
        switch self {
        case .none:
            return true
        case .some(let wrapped):
            return wrapped is NSNull
        }
    }

    /// 返回解包后的值或者默认值
    func or(_ default: Wrapped) -> Wrapped {
        return self ?? `default`
    }

    /// 返回解包后的值或`else`表达式的值
    func or(else: @autoclosure () -> Wrapped) -> Wrapped {
        return self ?? `else`()
    }

    /// 返回解包后的值或执行闭包返回值
    func or(else: () -> Wrapped) -> Wrapped {
        return self ?? `else`()
    }

    /// 当可选值不为空时，执行 `some` 闭包
    func on(some: () throws -> Void) rethrows {
        if self != nil { try some() }
    }

    /// 当可选值为空时，执行 `none` 闭包
    func on(none: () throws -> Void) rethrows {
        if self == nil { try none() }
    }
}

public extension Optional where Wrapped: Collection {
    var isNilOrEmpty: Bool {
        if isNull {
            return true
        }
        switch self {
        case .none:
            return true
        case .some(let wrapped):
            return wrapped.isEmpty
        }
    }

    /// 返回解包后的值或者默认值
    func emptyOr(_ default: Wrapped) -> Wrapped {
        if isNull { return `default` }
        switch self {
        case .none: return `default`
        case .some(let wrapped):
            return wrapped.isEmpty ? `default` : wrapped
        }
    }
}
